package com.buobao.screenlogcat

import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.joinAll
import kotlinx.coroutines.launch

import org.junit.Test
import org.junit.runner.RunWith

import org.junit.Assert.*

/**
 * Instrumented test, which will execute on an Android device.
 *
 * See [testing documentation](http://d.android.com/tools/testing).
 */
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
    @Test
    fun useAppContext() {
        // Context of the app under test.
        val appContext = InstrumentationRegistry.getInstrumentation().targetContext
        assertEquals("com.buobao.screenlogcat", appContext.packageName)
    }

    @Test
    fun coroutineTest() {
        //runBlocking可以创建协程作用域，但是会阻塞主线程，在其中创建的所有协程执行完后，主线程才会继续执行
//    runBlocking {
//        //这里可以通过launc或者async创建协程，区别是launch会返回一个Job，可以对Job进行操作，而async则会返回一个Deferred，可以对Deferred进行操作
//        launch {
//            suspendFun("this is coroutine1",500)
//        }
//        launch {
//            suspendFun("this is coroutine2",1500)
//        }
//        launch {
//            suspendFun("this is coroutine3",200)
//        }
//    }
//    println("this is main thread")


        //通过使用GlobalScope创建协程，协程会自动加入到协程调度器中，协程调度器默认是主线程
        //这里主线程会继续执行，而不是等待两个协程执行完，
        //当主线程执行完后就看不到两个协程的执行结果了
        //所以需要编码等待两个协程执行完
//    GlobalScope.launch {
//        launch {
//            suspendFun("this is coroutine1", 0)
//        }
//
//        launch {
//            suspendFun("this is coroutine2", 1500)
//        }
//    }
//
//    println("this is main thread")

        val coroutineScope = CoroutineScope(Job() + Dispatchers.IO)

        val job = coroutineScope.launch {
            val job1 = coroutineScope.launch {
                suspendFun("this is coroutine1", 0)
            }
            val job2 = coroutineScope.launch {
                suspendFun("this is coroutine2", 1500)
            }
            job1.join()
            job2.join()
        }
    }

    suspend fun suspendFun(msg: String, delay: Long) {
        delay(delay)
        println(msg)
    }
}